import axios from 'axios';
import { Message } from 'element-ui';
import store from '../store';
import { getToken } from '@/utils/auth';
import { projectConfig } from '@/utils/projectConfig'
import { MessageBox } from 'element-ui';
// import router from '@/router'
// 数据加载条显示组件
import NProgress from 'nprogress';
// 遮罩层组件
import { Loading } from 'element-ui';
// 消息通知组件
import { Notification } from 'element-ui';

// 用户公共方法
import { userBaseInfo } from '@/utils/userBaseInfo'

if(window.config.apiHostname==undefined||window.config.apiHostname==''){
	window.config.apiHostname=process.env.HOST_NAME;
}

// 创建axios实例,用于请求后台,进行数据的交换
const service = axios.create({
	//baseURL: process.env.HOST_NAME,
	baseURL:window.config.apiHostname,
	timeout: 50000  // 请求超时时间
});



// request拦截器
service.interceptors.request.use(config => {
	// console.log('request=' + JSON.stringify(config))
	//console.log('request method=' + config.method);
	//console.log('request url=' + config.url);

	// 获得请求的URL何请求的方法
	const requestUrl = config.url;
	const requestMethod = config.method;


	// 登录请求遮罩不显示
	/* if ( requestUrl.indexOf(projectConfig.URL_API_USER_LOGIN) == -1 && 
		requestUrl.indexOf(projectConfig.URL_API_USER_INFO) == -1 && 
		requestUrl.indexOf(projectConfig.URL_API_USER_VALIDATE_ACCOUNT) == -1 &&
		requestUrl.indexOf(projectConfig.URL_API_USER_VALIDATE_PASSWORD) == -1) {
		
		// 如果是post,delete,patch,put请求,显示遮罩
		if (requestMethod == 'post' || requestMethod == 'delete' || requestMethod == 'patch' || requestMethod == 'put' ) {
			// 全局遮罩服务配置
			Loading.service({ body: true });
		}
	} else {
		// 显示进度条加载
		//NProgress.start();
	} */
	if (store.getters.token) {
		config.headers['X-Token'] = getToken(); // 让每个请求携带自定义token 请根据实际情况自行修改
	}

	// 请求头添加应用操作对象信息
	const operObjectName = userBaseInfo.getOperObjectName();
	if (operObjectName != '' && operObjectName != null) {
		// 转换成16进制
		let operObjectName_hex = userBaseInfo.strToHexCharCode(operObjectName);
		config.headers['operObjectName'] = operObjectName_hex;
	}

	return config;
}, error => {
	// Do something with request error
	Promise.reject(error);
})

let _this = this;
// response,服务器端返回拦截器
service.interceptors.response.use(
	response => {
		/**
		* code为非200是抛错 可结合自己业务进行修改
		*/
		if (response.data.meta == undefined) {
			return response.data;
		}
		const res = response.data.meta;
		if (res.code == projectConfig.CODE_UNAUTHORIZED) {
			// 456: 非法的token;其他客户端登录了;Token 过期了
			// 回到登录页面
			MessageBox.confirm('你已被登出，可以取消继续留在该页面，或者重新登录', '确定登出', {
				confirmButtonText: '重新登录',
				cancelButtonText: '取消',
				type: 'warning'
			}).then(() => {
				store.dispatch('FedLogOut').then(() => {
					location.reload();// 为了重新实例化vue-router对象 避免bug
				});
			})

			return Promise.reject('error');
		} else if (res.code == projectConfig.CODE_SYSTEM_EXCEPTION) {
			// 平台异常
			Notification.error({
				title: '错误',
				message: res.message
			});
		} else if (res.code == projectConfig.CODE_VENUS_EXCEPTION) {
			//  平台业务事件异常 warning
			Notification.warning({
				title: '警告',
				message: res.message
			});
		} else if (res.code == 500) {
			Notification.warning({
				title: '警告',
				message: res.message
			});
		} else {

			// 200 正常
			const _message = res.message;
			if (_message != '') {
				Notification.success({
					title: '成功',
					message: _message
				});
			}

			return response.data;
		}
		// 全局返回状态码拦截.end
	},
	error => {
		// 关闭遮罩
		// const loadingInstance = Loading.service({ body: fase });
		//loadingInstance.close();

		/* Message({
			message: error.message,
			type: 'error',
			duration: 5 * 1000
		}); */

		Notification.error({
			title: '错误',
			message: error.message
		});

		return Promise.reject(error);
	}
)

export default service;
